#include <dde_kit/resources.h>
#include <dde_kit/assert.h>

#include <eku/stdio.h>
#include <eku/stdlib.h>
#include <eku/symbol.h>

#include <inc/x86.h>

extern dde_kit_addr_t *inv_map;

int
dde_kit_request_mem(dde_kit_addr_t start, dde_kit_size_t size,
					 int wc, dde_kit_addr_t *vaddr)
{
	 dde_kit_assert(((uint32_t)start & (DDE_KIT_PAGE_SIZE - 1)) == 0);
	 dde_kit_assert(((uint32_t)size & (DDE_KIT_PAGE_SIZE - 1)) == 0);

	 void *res = vmalloc(size, start);
	 if (res == NULL)
		  return -1;

	 unsigned pages = (size + DDE_KIT_PAGE_SHIFT - 1) >> DDE_KIT_PAGE_SHIFT;

	 int i;
	 for (i = 0; i != pages; ++ i)
	 {
		  inv_map[(start >> DDE_KIT_PAGE_SHIFT) + i] =
			   (dde_kit_addr_t)res + (i << DDE_KIT_PAGE_SHIFT);
	 }
	 
	 *vaddr = (dde_kit_addr_t)res;

	 return 0;
}

int
dde_kit_release_mem(dde_kit_addr_t start, dde_kit_size_t size)
{
	 dde_kit_assert(((uint32_t)start & (DDE_KIT_PAGE_SIZE - 1)) == 0);
	 dde_kit_assert(((uint32_t)size & (DDE_KIT_PAGE_SIZE - 1)) == 0);
	 
	 vfree ((void *)inv_map[(start >> DDE_KIT_PAGE_SHIFT)]);

	 return 0;
}

void
dde_kit_resources_symbol(void)
{
	 export_symbol("dde_kit_request_mem", &dde_kit_request_mem, 1);
	 export_symbol("dde_kit_release_mem", &dde_kit_release_mem, 1);
}
